package com.tegtech.tools.wechat.support;

import org.springframework.util.Assert;

import com.tegtech.tools.wechat.domain.LoginResult;
import com.tegtech.tools.wechat.domain.WeChatUser;
import com.tegtech.tools.wechat.util.WeChatDecryptUtil;

import cn.hutool.json.JSONUtil;

/**
 * 微信信息解密处理类
 * @Author Jun
 * @date 2020年5月31日 下午4:22:49
 */
public class WeChatDecipherSupport {
	
	/**
	 * 解析微信用户登录数据
	 * @param code
	 * @param appid
	 * @param appSecret
	 */
	public static LoginResult decipherWxLogin(String code) {
		LoginResult result = WeChatSupport.jscode2session(code);
		Assert.notNull(result, "认证失败，小程序登录code无效");
		Integer errcode = result.getErrcode();
		Assert.isTrue(errcode == null || errcode == 0, result.getErrmsg());
		return result;
	}
	
	/**
	 * 解析微信用户信息
	 * @param encryptedData 目标密文
	 * @param sessionkey  	会话ID
	 * @param iv          	加密算法的初始向量
	 * @return
	 */
	public static WeChatUser decipherUser(String encryptedData, String sessionkey, String iv) {
		String decipherData = WeChatDecryptUtil.decrypt(encryptedData, sessionkey, iv);
		Assert.notNull(decipherData, "认证失败，小程序登录数据解析失败");
		return JSONUtil.toBean(decipherData, WeChatUser.class);
	}
	
	/**
	 * 解析微信用户unionid
	 * @param encryptedData 目标密文
	 * @param sessionkey  	会话ID
	 * @param iv          	加密算法的初始向量
	 * @return
	 */
	public static String decipherUnionid(String encryptedData, String sessionkey, String iv) {
		String decipherData = WeChatDecryptUtil.decrypt(encryptedData, sessionkey, iv);
		Assert.notNull(decipherData, "认证失败，小程序登录数据解析失败");
		return JSONUtil.parseObj(decipherData).getStr("unionId");
	}
	
	/**
	 * 解析用户手机号
	 * @param encryptedData	目标密文
	 * @param iv			加密算法的初始向量
	 * @param code			小程序登录code
	 * @param appid
	 * @param appSecret
	 * @return
	 */
	public static String decipherPhone(String encryptedData, String iv, String code) {
		LoginResult result = WeChatSupport.jscode2session(code);
		if (result != null) {
			String sessionkey = result.getSession_key();
			String decipherData = WeChatDecryptUtil.decrypt(encryptedData, sessionkey, iv);
			return JSONUtil.parseObj(decipherData).getStr("phoneNumber");
		}
		return null;
	}
	
}
